#ifndef __QUBIT_H__
#define __QUBIT_H__

#include <complex>
#include <cstring>
#include <iostream>
#include "qreg.h"
#include "gate.h"
using namespace std;

#define type float

class gate;

class qubit{
public:
    int n;              // 态矢量维度
    complex<type> * v;  // 态矢量指针
    
    ////
    friend class qreg;

    qubit(int n = 2);        // 构造空态矢量
    qubit(complex<type> *, int n = 2); // 构造态矢量
    qubit(const qubit &);
    ~qubit();

    qubit & operator=(const qubit &);

    int getDim();           // 获取矢量维度
    void getAmplitude();    // 获取概率幅

    // friend qubit qubit::conjugate(const qubit * a);    // 共轭
    // friend complex<type> qubit::innerProduct(qubit * a, qubit * b);   // 内积
    friend qubit tensorProduct(qubit &, qubit &);   // 张量积
    friend void linearTransform(gate &, qubit &);   // 线性变换
    // Matrix outerProduct(qubit * a, qubit * b);  // 外积
};

#endif